#!/usr/bin/env node

/**
 * 应用发布管理脚本
 * 用于管理版本号、生成发布说明、创建发布包
 */

const fs = require('fs')
const path = require('path')
const { execSync } = require('child_process')

// 发布配置
const RELEASE_CONFIG = {
  // 版本类型
  versionTypes: {
    'patch': '修复版本 (1.0.0 -> 1.0.1)',
    'minor': '功能版本 (1.0.0 -> 1.1.0)', 
    'major': '重大版本 (1.0.0 -> 2.0.0)'
  },
  
  // 发布渠道
  channels: {
    'stable': '稳定版',
    'beta': '测试版',
    'alpha': '内测版'
  },
  
  // 文件路径
  paths: {
    packageJson: 'package.json',
    tauriConfig: 'src-tauri/tauri.conf.json',
    cargoToml: 'src-tauri/Cargo.toml',
    changelog: 'CHANGELOG.md',
    releaseNotes: 'RELEASE_NOTES.md'
  }
}

class ReleaseManager {
  constructor() {
    this.currentVersion = this.getCurrentVersion()
    this.releaseInfo = {
      version: null,
      channel: 'stable',
      features: [],
      fixes: [],
      breaking: [],
      timestamp: new Date().toISOString()
    }
  }

  /**
   * 获取当前版本号
   */
  getCurrentVersion() {
    try {
      const packageJson = JSON.parse(fs.readFileSync(RELEASE_CONFIG.paths.packageJson, 'utf8'))
      return packageJson.version
    } catch (error) {
      console.error('❌ 无法读取当前版本号')
      return '1.0.0'
    }
  }

  /**
   * 计算新版本号
   */
  calculateNewVersion(type) {
    const [major, minor, patch] = this.currentVersion.split('.').map(Number)
    
    switch (type) {
      case 'major':
        return `${major + 1}.0.0`
      case 'minor':
        return `${major}.${minor + 1}.0`
      case 'patch':
        return `${major}.${minor}.${patch + 1}`
      default:
        throw new Error(`不支持的版本类型: ${type}`)
    }
  }

  /**
   * 更新版本号
   */
  updateVersion(newVersion) {
    console.log(`📝 更新版本号: ${this.currentVersion} -> ${newVersion}`)
    
    // 更新 package.json
    this.updatePackageJson(newVersion)
    
    // 更新 Tauri 配置
    this.updateTauriConfig(newVersion)
    
    // 更新 Cargo.toml
    this.updateCargoToml(newVersion)
    
    this.releaseInfo.version = newVersion
    console.log('✅ 版本号更新完成')
  }

  /**
   * 更新 package.json
   */
  updatePackageJson(version) {
    const packagePath = RELEASE_CONFIG.paths.packageJson
    const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'))
    
    packageJson.version = version
    
    fs.writeFileSync(packagePath, JSON.stringify(packageJson, null, 2) + '\n')
    console.log(`  ✅ 已更新 ${packagePath}`)
  }

  /**
   * 更新 Tauri 配置
   */
  updateTauriConfig(version) {
    const configPath = RELEASE_CONFIG.paths.tauriConfig
    const config = JSON.parse(fs.readFileSync(configPath, 'utf8'))
    
    config.package.version = version
    
    fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n')
    console.log(`  ✅ 已更新 ${configPath}`)
  }

  /**
   * 更新 Cargo.toml
   */
  updateCargoToml(version) {
    const cargoPath = RELEASE_CONFIG.paths.cargoToml
    
    if (!fs.existsSync(cargoPath)) {
      console.log(`  ⚠️  ${cargoPath} 不存在，跳过更新`)
      return
    }
    
    let cargoContent = fs.readFileSync(cargoPath, 'utf8')
    
    // 使用正则表达式更新版本号
    cargoContent = cargoContent.replace(
      /^version\s*=\s*"[^"]*"/m,
      `version = "${version}"`
    )
    
    fs.writeFileSync(cargoPath, cargoContent)
    console.log(`  ✅ 已更新 ${cargoPath}`)
  }

  /**
   * 生成更新日志
   */
  generateChangelog() {
    console.log('📋 生成更新日志...')
    
    const changelogPath = RELEASE_CONFIG.paths.changelog
    const version = this.releaseInfo.version
    const date = new Date().toLocaleDateString('zh-CN')
    
    let changelog = ''
    
    // 如果文件存在，读取现有内容
    if (fs.existsSync(changelogPath)) {
      changelog = fs.readFileSync(changelogPath, 'utf8')
    } else {
      changelog = '# 更新日志\n\n本文档记录了 YunPo Markdown Editor 的所有重要更改。\n\n'
    }
    
    // 生成新版本的更新内容
    let newEntry = `## [${version}] - ${date}\n\n`
    
    if (this.releaseInfo.features.length > 0) {
      newEntry += '### ✨ 新功能\n'
      this.releaseInfo.features.forEach(feature => {
        newEntry += `- ${feature}\n`
      })
      newEntry += '\n'
    }
    
    if (this.releaseInfo.fixes.length > 0) {
      newEntry += '### 🐛 问题修复\n'
      this.releaseInfo.fixes.forEach(fix => {
        newEntry += `- ${fix}\n`
      })
      newEntry += '\n'
    }
    
    if (this.releaseInfo.breaking.length > 0) {
      newEntry += '### 💥 破坏性更改\n'
      this.releaseInfo.breaking.forEach(change => {
        newEntry += `- ${change}\n`
      })
      newEntry += '\n'
    }
    
    // 插入新版本到文件开头
    const lines = changelog.split('\n')
    const insertIndex = lines.findIndex(line => line.startsWith('## [')) || lines.length
    
    lines.splice(insertIndex, 0, newEntry)
    
    fs.writeFileSync(changelogPath, lines.join('\n'))
    console.log(`✅ 更新日志已生成: ${changelogPath}`)
  }

  /**
   * 生成发布说明
   */
  generateReleaseNotes() {
    console.log('📄 生成发布说明...')
    
    const notesPath = RELEASE_CONFIG.paths.releaseNotes
    const version = this.releaseInfo.version
    const channel = this.releaseInfo.channel
    
    let notes = `# YunPo Markdown Editor v${version}\n\n`
    notes += `**发布渠道**: ${RELEASE_CONFIG.channels[channel]}\n`
    notes += `**发布时间**: ${new Date().toLocaleString('zh-CN')}\n\n`
    
    notes += '## 📖 关于此版本\n\n'
    notes += 'YunPo Markdown Editor 是一款现代化的跨平台Markdown文档编辑器，'
    notes += '集成了AI智能写作助手、Git版本控制、实时预览等强大功能。\n\n'
    
    if (this.releaseInfo.features.length > 0) {
      notes += '## ✨ 新功能\n\n'
      this.releaseInfo.features.forEach(feature => {
        notes += `- ${feature}\n`
      })
      notes += '\n'
    }
    
    if (this.releaseInfo.fixes.length > 0) {
      notes += '## 🐛 问题修复\n\n'
      this.releaseInfo.fixes.forEach(fix => {
        notes += `- ${fix}\n`
      })
      notes += '\n'
    }
    
    if (this.releaseInfo.breaking.length > 0) {
      notes += '## 💥 破坏性更改\n\n'
      this.releaseInfo.breaking.forEach(change => {
        notes += `- ${change}\n`
      })
      notes += '\n'
    }
    
    notes += '## 📦 下载\n\n'
    notes += '### 系统要求\n\n'
    notes += '- **macOS**: 10.13 或更高版本\n'
    notes += '- **Windows**: Windows 10 或更高版本\n'
    notes += '- **Linux**: 支持 AppImage 的现代发行版\n\n'
    
    notes += '### 安装说明\n\n'
    notes += '1. 从 [Releases](https://github.com/yunpo/markdown-editor/releases) 页面下载对应平台的安装包\n'
    notes += '2. 按照平台说明进行安装\n'
    notes += '3. 首次启动时可能需要配置 AI 服务和 Git 设置\n\n'
    
    notes += '## 🔧 技术栈\n\n'
    notes += '- **桌面框架**: Tauri + Vue 3 + TypeScript\n'
    notes += '- **编辑器**: CodeMirror 6 + markdown-it\n'
    notes += '- **AI 集成**: OpenAI API\n'
    notes += '- **版本控制**: isomorphic-git\n'
    notes += '- **UI 框架**: Element Plus + SCSS\n\n'
    
    notes += '## 🐛 问题反馈\n\n'
    notes += '如果您遇到任何问题或有功能建议，请通过以下方式联系我们：\n\n'
    notes += '- [GitHub Issues](https://github.com/yunpo/markdown-editor/issues)\n'
    notes += '- [讨论区](https://github.com/yunpo/markdown-editor/discussions)\n\n'
    
    notes += '## 📝 许可证\n\n'
    notes += '本项目采用 MIT 许可证，详情请查看 [LICENSE](LICENSE) 文件。\n'
    
    fs.writeFileSync(notesPath, notes)
    console.log(`✅ 发布说明已生成: ${notesPath}`)
  }

  /**
   * 创建 Git 标签
   */
  createGitTag() {
    const version = this.releaseInfo.version
    const tagName = `v${version}`
    
    console.log(`🏷️  创建 Git 标签: ${tagName}`)
    
    try {
      // 检查是否有未提交的更改
      const status = execSync('git status --porcelain', { encoding: 'utf8' }).trim()
      if (status) {
        console.log('📝 提交版本更新...')
        execSync('git add .')
        execSync(`git commit -m "chore: bump version to ${version}"`)
      }
      
      // 创建标签
      execSync(`git tag -a ${tagName} -m "Release ${version}"`)
      console.log(`✅ Git 标签已创建: ${tagName}`)
      
      // 推送标签
      console.log('📤 推送标签到远程仓库...')
      execSync(`git push origin ${tagName}`)
      execSync('git push origin main')
      console.log('✅ 标签已推送到远程仓库')
      
    } catch (error) {
      console.error('❌ Git 操作失败:', error.message)
      console.log('请手动执行以下命令:')
      console.log(`  git add .`)
      console.log(`  git commit -m "chore: bump version to ${version}"`)
      console.log(`  git tag -a ${tagName} -m "Release ${version}"`)
      console.log(`  git push origin ${tagName}`)
      console.log(`  git push origin main`)
    }
  }

  /**
   * 交互式收集发布信息
   */
  async collectReleaseInfo(versionType, channel = 'stable') {
    console.log('📝 收集发布信息...')
    
    // 计算新版本号
    const newVersion = this.calculateNewVersion(versionType)
    this.releaseInfo.version = newVersion
    this.releaseInfo.channel = channel
    
    console.log(`📦 新版本: ${newVersion}`)
    console.log(`📢 发布渠道: ${RELEASE_CONFIG.channels[channel]}`)
    
    // 这里可以添加交互式输入功能
    // 为了简化，我们使用预定义的发布信息
    this.releaseInfo.features = [
      '完整的跨平台Markdown编辑器功能',
      'AI智能写作助手集成',
      'Git版本控制系统',
      '实时预览和同步滚动',
      '性能监控和优化系统',
      '现代化macOS 26设计风格'
    ]
    
    this.releaseInfo.fixes = [
      '修复了大文件编辑时的性能问题',
      '优化了跨平台兼容性',
      '改进了AI助手的响应速度',
      '修复了Git操作的稳定性问题'
    ]
    
    console.log('✅ 发布信息收集完成')
  }

  /**
   * 执行发布流程
   */
  async release(versionType, channel = 'stable') {
    console.log('🚀 开始发布流程...')
    console.log('=' .repeat(50))
    
    try {
      // 1. 收集发布信息
      await this.collectReleaseInfo(versionType, channel)
      
      // 2. 更新版本号
      this.updateVersion(this.releaseInfo.version)
      
      // 3. 生成更新日志
      this.generateChangelog()
      
      // 4. 生成发布说明
      this.generateReleaseNotes()
      
      // 5. 创建 Git 标签
      this.createGitTag()
      
      console.log('\n🎉 发布流程完成!')
      console.log(`📦 版本: ${this.releaseInfo.version}`)
      console.log(`📢 渠道: ${RELEASE_CONFIG.channels[channel]}`)
      console.log('\n下一步:')
      console.log('1. 运行构建脚本: npm run build')
      console.log('2. 测试生成的应用包')
      console.log('3. 发布到应用商店或分发平台')
      
    } catch (error) {
      console.error('\n💥 发布流程失败!')
      console.error(`错误信息: ${error.message}`)
      process.exit(1)
    }
  }
}

// 命令行参数处理
function parseArguments() {
  const args = process.argv.slice(2)
  const options = {
    versionType: 'patch',
    channel: 'stable',
    help: false
  }
  
  for (let i = 0; i < args.length; i++) {
    const arg = args[i]
    
    if (arg === '--help' || arg === '-h') {
      options.help = true
    } else if (arg === '--version' || arg === '-v') {
      options.versionType = args[i + 1]
      i++
    } else if (arg === '--channel' || arg === '-c') {
      options.channel = args[i + 1]
      i++
    } else if (arg.startsWith('--version=')) {
      options.versionType = arg.split('=')[1]
    } else if (arg.startsWith('--channel=')) {
      options.channel = arg.split('=')[1]
    }
  }
  
  return options
}

// 显示帮助信息
function showHelp() {
  console.log('YunPo Markdown Editor 发布管理工具')
  console.log('')
  console.log('用法:')
  console.log('  node scripts/release.js [选项]')
  console.log('')
  console.log('选项:')
  console.log('  -v, --version <类型>   版本类型 (patch, minor, major)')
  console.log('  -c, --channel <渠道>   发布渠道 (stable, beta, alpha)')
  console.log('  -h, --help             显示帮助信息')
  console.log('')
  console.log('版本类型:')
  Object.entries(RELEASE_CONFIG.versionTypes).forEach(([key, desc]) => {
    console.log(`  ${key.padEnd(8)} - ${desc}`)
  })
  console.log('')
  console.log('发布渠道:')
  Object.entries(RELEASE_CONFIG.channels).forEach(([key, desc]) => {
    console.log(`  ${key.padEnd(8)} - ${desc}`)
  })
  console.log('')
  console.log('示例:')
  console.log('  node scripts/release.js                           # 发布补丁版本到稳定渠道')
  console.log('  node scripts/release.js --version minor           # 发布功能版本')
  console.log('  node scripts/release.js --version major --channel beta  # 发布重大版本到测试渠道')
}

// 主程序入口
async function main() {
  const options = parseArguments()
  
  if (options.help) {
    showHelp()
    return
  }
  
  // 验证参数
  if (!RELEASE_CONFIG.versionTypes[options.versionType]) {
    console.error(`❌ 不支持的版本类型: ${options.versionType}`)
    console.error('支持的类型:', Object.keys(RELEASE_CONFIG.versionTypes).join(', '))
    process.exit(1)
  }
  
  if (!RELEASE_CONFIG.channels[options.channel]) {
    console.error(`❌ 不支持的发布渠道: ${options.channel}`)
    console.error('支持的渠道:', Object.keys(RELEASE_CONFIG.channels).join(', '))
    process.exit(1)
  }
  
  const releaseManager = new ReleaseManager()
  await releaseManager.release(options.versionType, options.channel)
}

// 运行主程序
if (require.main === module) {
  main().catch(error => {
    console.error('💥 发布脚本执行失败:', error)
    process.exit(1)
  })
}

module.exports = { ReleaseManager, RELEASE_CONFIG }